简介
- MyBatis环境搭建 的方式在前面已经详细的介绍过了,本文仍然通过映射配置文件,但不再使用代理持久层接口实现类的方式,而是使用手动编写持久层实现类的方式来进行MySQL数据库的CRUD操作。
- 创建持久层接口实现类的方式在实际开发中并不常用,所以我会将本文的主题放在与使用代理持久层实现类方法的比较上。
- 改变的内容主要是测试类和持久层接口实现类。
目录结构
- src/main
- java
- cn/water/dao
- impl
- UserDaoImpl.java(持久层实现类)
- UserDao.java(持久层接口)
- impl
- cn/water/domain
- User.java(实体类)
- resources
- cn/water/dao
- UserDao.xml(映射配置文件)
- SqlMapConfig.xml(MyBatis主配置文件)
- cn/water/dao
- cn/water/dao
- java
- src/tese
- java
- cn/water/test
- MybatisTest.java(测试文件)
- cn/water/test
- java
持久层接口
UserDao.java
1 | package cn.water.dao; |
映射配置文件
UserDao.xml
1 |
|
持久层实现类
UserDaoImp.java
1 | package cn.water.dao; |
测试类
Test.java
1 | package cn.water.test; |
ProxyDao vs MyDao
- ProxyDao 和 MyDao 的具体区别在于:
- 当我们使用代理持久层实现类的方式时,代理对象会帮我们增强代码去调用 selectList方法;
- 但是当我们使用手动编写持久层实现类的方式时,我们就需要自己去编写实现类实现方法去调用 selectList方法了。
- 而且我们不难发现,都是实现同一个功能,在测试类中 ProxyDao 比 MyDao 多了2行代码。但恐怖的是,MyDao 比 ProxyDao 多了一个类。
ProxyDao
测试类
1 | /* 1.加载 MyBatis配置文件 */ |
MyDao
测试类
1 | /* 1.加载 MyBatis配置文件 */ |
实现类
1 | /* 5.调用方法 */ |
实现CRUD操作
- 本章节抛开了获取代理持久层实现类或持久层实现类的代码,以便直接显示 ProxyDao 和 MyDao 的具体区别。
- 我们可以明显的看出 MyDao 代码的臃肿,所以这也是为什么手动编写持久层实现类的方法在实际编程中不受欢迎的原因了。
思维导图
![](4.MyDao CRUD操作/ProxyDao MyDao 区别.png)
添加用户
ProxyDao
- 测试类
1 | dao.add( new User(100,"ADD",new Date(),"男","UserDao") ); |
MyDao
- 测试类
1 | dao.add( new User(100,"ADD",new Date(),"男","UserDao") ); |
- 实现类
1 | public void add(User user){ |
更新用户
ProxyDao
- 测试类
1 | dao.update( new User(100,"UPDATE",new Date(),"男","UserDao") ); |
MyDao
- 测试类
1 | dao.update( new User(100,"UPDATE",new Date(),"男","UserDao") ); |
- 实现类
1 | public void update(User user){ |
删除用户
ProxyDao
- 测试类
1 | dao.delete(100); |
MyDao
- 测试类
1 | dao.delete(100); |
- 实现类
1 | public void delete(Integer id){ |
查找所有用户
ProxyDao
- 测试类
1 | for (User user : dao.findAll()) { |
MyDao
- 测试类
1 | for (User user : dao.findAll()) { |
- 实现类
1 | public List<User> findAll(){ |
查询单个用户
ProxyDao
- 测试类
1 | System.out.println( dao.findOne(41) ); |
MyDao
- 测试类
1 | System.out.println( dao.findOne(41) ); |
- 实现类
1 | public User findOne(Integer id){ |
根据姓名模糊查询
ProxyDao
- 测试类
1 | List<User> userList1 = dao.findByName01("%王%"); |
MyDao
- 测试类
1 | List<User> userList1 = dao.findByName01("%王%"); |
- 实现类
1 | public List<User> findByName01(String name){ |
查询所有用户数量
ProxyDao
- 测试类
1 | System.out.println( dao.findTotal() ); |
MyDao
- 测试类
1 | System.out.println( dao.findTotal() ); |
- 实现类
1 | public Integer findTotal(){ |
执行过程(思维流图)
查询方法
![](4.MyDao CRUD操作/MyDao 查询操作 底层.png)
增删改方法
![](4.MyDao CRUD操作/MyDao 增删改操作 底层.png)